package org.dromara.hm.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import jakarta.validation.constraints.NotEmpty;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.hm.domain.HmCustomer;
import org.dromara.hm.domain.vo.HmCustomerVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;

import java.util.Date;
import java.util.List;

/**
 * 客户信息Mapper接口
 *
 * @author zy Hu
 * @date 2024-12-15
 */
public interface HmCustomerMapper extends BaseMapperPlus<HmCustomer, HmCustomerVo> {

    @Override
    @DataPermission({
        @DataColumn(key = "deptName", value = "store_id"),
        @DataColumn(key = "userName", value = "staff_id")
    })
    default <P extends IPage<HmCustomerVo>> P selectVoPage(IPage<HmCustomer> page, Wrapper<HmCustomer> wrapper)
    {
        return BaseMapperPlus.super.selectVoPage(page, wrapper);
    }

    @Override
    @DataPermission({
        @DataColumn(key = "deptName", value = "store_id"),
        @DataColumn(key = "userName", value = "staff_id")
    })
    default List<HmCustomer> selectList()
    {
        return BaseMapperPlus.super.selectList();
    }

    /**
     * 批量更新客户的服务员工和归属店铺
     *
     * @param customerIds   客户ID列表
     * @param newStaffId    新员工ID (null if not changing)
     * @param newStaffName  新员工姓名 (null if not changing staff)
     * @param newStoreId    新店铺ID (null if not changing)
     * @param newStoreName  新店铺名称 (null if not changing store)
     * @param updateBy      更新者
     * @param updateTime    更新时间
     * @param lastMaintainDate 最后维护时间
     * @return 更新的行数
     */
    int updateCustomerStaffAndStoreBatch(
        @Param("customerIds") List<Long> customerIds,
        @Param("newStaffId") Long newStaffId,
        @Param("newStaffName") String newStaffName,
        @Param("newStoreId") Long newStoreId,
        @Param("newStoreName") String newStoreName,
        @Param("updateBy") String updateBy,
        @Param("updateTime") Date updateTime,
        @Param("lastMaintainDate") Date lastMaintainDate
    );

    /**
     * 查询需要转入公池的客户。
     * 条件：非公池客户，且最近一次订单时间或最近一次回访完成时间超过指定天数。
     *
     * @param daysThreshold 天数阈值 (例如 90 天)
     * @return 符合条件的客户列表，包含客户ID、店铺ID等信息
     */
    List<HmCustomer> selectCustomersForPublicPoolTransfer(@Param("daysThreshold") int daysThreshold);
}
